﻿// import { BACKEND_HOST_LOCAL } from '@/constants';
import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { history } from '@umijs/max';
import {refreshTokenPost} from '@/services/backend/userController'
import { message } from 'antd';
import { SUCCESS_CODE } from '@/constants/index';

// 与后端约定的响应数据格式
interface ResponseStructure {
  code?: number;
  data: any;
  message?: string;
  trace_id?: string;
}

const isDev = process.env.NODE_ENV === 'development';
let isRefreshing = false;
let retryRequests = [];

async function refreshToken () {
  
}


/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const requestConfig: RequestConfig = {
  // baseURL: BACKEND_HOST_LOCAL,
  withCredentials: true,
  // errorConfig: {
  //   errorThrower: (res: ResponseStructure) => {
  //   },
  //   // 错误接收及处理
  //   errorHandler: (error: any) => {
  //     if (error.response) {
  //       console.log(error.response)
  //       if(error.response.status === 401){
  //         retryRequests.push(error.response.config)
  //         if(!isRefreshing){
  //           isRefreshing = true;
  //           const currentUser = JSON.parse(sessionStorage.getItem('currentUser')||'');
  //             // 刷新token
  //             refreshTokenPost({userAccount:currentUser.userAccount}).then(res => {
  //               sessionStorage.setItem('tokenValue', res.data as string);
  //               // console.log('111')
  //               retryRequests.forEach((config)=>{
  //                 console.log(config)
  //                 request(config.url, {
  //                   ...config,
  //                   headers: {
  //                     ...config.headers,
  //                     // 可以在这里添加或修改 headers
  //                   },
  //                 }).then((res)=>{
  //                   return res;
  //                 })
  //                 .catch((error) => {
  //                   console.log(error);
  //                 })
            
  //               })

  //             }).catch(() => {
  //                 retryRequests = [];
  //                 message.error("自动登录失败，请重新登录");
  //                 // 刷新Token 失败 清空缓存的用户信息 并调整到登录页面
  //                 history.replace({
  //                   pathname: '/user/login'
  //                 });
  //                 console.log('222')

  //             })
  //             .finally(() => {
  //                 // 请求完成后重置flag
  //               isRefreshing = false;
  //             });

  //           }
  //       }
  //       else{
  //         // return new Promise(resolve => {
  //         //   // 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
  //         //   retryRequests.push(info => {
  //         //     console.log(info)
  //         //       // 将新的Token重新赋值  
  //         //     // config.params.token = info.Token;
  //         //     // config.params.appkey = info.AppKey;
  //         //     // resolve(request(config));
  //         //   });
  //         // });

  //       }
  //     } 
  //     else if (error.request) {
  //       // 请求已经成功发起，但没有收到响应
  //       message.error('服务器错误，请稍后重试！');
  //     } else {
  //       // 发送请求时出了点问题
  //       message.error('请求错误，请重试！');
  //     }
  //   },

  // },
  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      const headers = {};
      const tokenValue = sessionStorage.getItem('tokenValue');
      if (tokenValue) {
        // @ts-ignore
        headers.Authorization = tokenValue as any;
      }
      config.headers = headers;
      return config;
    },
    [(config: RequestOptions) => {return config}, (error) => {return Promise.reject(error)}],
    // // 数组，省略错误处理
    [(config: RequestOptions) => {return config}]
    
  ],

  // 响应拦截器
    responseInterceptors : [
    (response) => {
      var requests = []
      const config = response.config;
      console.log(response)
      const { data } = response as unknown as ResponseStructure;
      if (!data) {
        message.error('服务异常，请重试！');
      }
      // 错误码处理
      const code: number = data.code;
      if(code !== undefined){
        if (code !== SUCCESS_CODE) { 
          console.log(data)
          message.error(data.message);
        }
      }
      return response;
    },
    [(response) => {return response}, (error) => {
      console.log(error);
      if(error.response.status === 401){
              console.log('token过期')
              const currentUser = JSON.parse(sessionStorage.getItem('currentUser')||'');
              if(!isRefreshing){
              isRefreshing = true;
                // 刷新token
              refreshTokenPost({userAccount:currentUser.userAccount}).then(res => {
                sessionStorage.setItem('tokenValue', res.data as string);
                console.log('token刷新成功')
                location.reload();
                ////重新发送请求并返回数据
                // retryRequests.forEach((config) => {
                //   request(config.url, {
                //     ...config,
                //     headers: {
                //       ...config.headers,
                //     },
                //   }).then((res) => {
                //     console.log('重发请求成功')
                //     retryRequests.shift(); // 成功后从数组中移除
                //     return res;
                //   }).catch((err) => {
                //     retryRequests.shift(); // 失败后也从数组中移除
                //     message.error("重试请求失败，请手动重试");
                //   });
                // });
                //

                
              }).catch(() => {
                  retryRequests = [];
                  message.error("自动登录失败，请重新登录");
                  // 刷新Token 失败 清空缓存的用户信息 并调整到登录页面
                  history.replace({
                    pathname: '/user/login'
                  });
                  console.log('222')

              })
              .finally(() => {
                    // 请求完成后重置flag
                  isRefreshing = false;
                });

              }
              else{
                retryRequests.push(error.response.config)
              }
           
      }
      return Promise.reject(error)
    }],
    // // 数组，省略错误处理
    // [(response) => {return response}]
  ],
};


